package funcs

import (
	"bufio"
	"bytes"
	log "github.com/YoungPioneers/blog4go"
	"io"
	"os"
	"os/exec"
	"strings"
	"time"
)

/**
解除阻止的ip地址
bad_ip_list:阻止IP的列表
ban_period：拉黑时间
 */
func Unbanip(black_ip_list string, block_time int64, ipset_black_list_name string) {

	//第一步：将要解除的bad_ip从阻止IP列表中清除掉。
	//***********************先尝试把bad_ip_list中的ip给删除认为这个IP解除了阻止。
	//为什么先删除bad_ip_list呢？而不是先执行ipset del呢？
	//因为在创建ipset list的时候会添加一个默认时间timeout，这样即使程序除了什么不可预料的问题，ipset最终也会将这些ip给解禁。
	//读取bad ip列表
	f, err := os.OpenFile(black_ip_list, os.O_RDONLY|os.O_CREATE, 0666)
	if err != nil {
		log.Error("在解除bad_ip,需要打开bad_ip_list时出错：", err.Error())
	}
	defer f.Close()

	bufReader := bufio.NewReader(f)
	var buf bytes.Buffer
	for {
		line, _, err := bufReader.ReadLine()
		if err != nil || err == io.EOF {
			break
		}
		//fmt.Println(string(line))
		//将每行进行切片，进而获取第一个元素为ip地址，第二个元素为时间的切片
		value_trim_slice := strings.Split(string(line), "|")
		//IP地址
		//fmt.Println(strings.TrimSpace(value_trim_slice[0]))
		//时间
		//fmt.Println(strings.TrimSpace(value_trim_slice[1]))
		//bad_ip的开始阻止的时间字符串
		bad_ip := strings.TrimSpace(value_trim_slice[0])
		bad_ip_start_time_str := strings.TrimSpace(value_trim_slice[1])
		//bad_ip的开始阻止的时间，将字符串转换成time类型
		bad_ip_start_time, _ := time.ParseInLocation("2006-01-02 15:04:05", bad_ip_start_time_str, time.Local)

		//bad_ip从开始阻止，到当前为止的时间差
		sec := int64(time.Now().Sub(bad_ip_start_time).Seconds())
		//fmt.Println(sec)
		//fmt.Println("----------------------")
		//如果当前时间差已经大于我们想要拉黑的时间，那么就应该将该ip从IP阻止列表中移除。
		if sec > block_time {
			//	这里为了效率，我们使用Linux系统的sed命令来清除bad_ip_list中的bad_ip
			//组装sed命令
			//样式：sed -i '/140.207.119.14 xxxxxx/d' tmp.txt

			buf.Reset()
			buf.WriteString("sed -i '/")
			buf.WriteString(string(line))
			buf.WriteString("/d' ")
			buf.WriteString(black_ip_list)
			//	执行命令
			cmd := exec.Command("/bin/bash", "-c", buf.String())
			_, err := cmd.CombinedOutput()
			if err != nil {
				log.Error(bad_ip, " 的阻止时间已到，在从bad_ip_list中农清除时发生错误，err.Error():", err.Error())
				//	如果清除时错误，那么久暂时先不要讲IPSET LIST的IP删除，否则不一致的话，排错更不好排
				continue
			}
			//log.Info(bad_ip, "\t的拉黑时间已经超过", block_time, "秒，已成功从BLACK_IP_LIST移除~~~~")
			log.Info(bad_ip, " block time was more than ", block_time, "seconds,The IP was Unblock")
			//如果清除成功了，那么准备第二步，讲bad_ip从IPSET LIST中del
			//第二步：将要解除的bad_ip从IPSET LIST从del
			err1 := IPsetDel(ipset_black_list_name, bad_ip)
			if err1 != nil {
				log.Error(bad_ip, " 已经从bad_ip_list中清除，但是在ipset del时出错，err.Error():", err.Error())
			}
			//log.Info(bad_ip, "\t的拉黑时间已经超过", block_time, "秒，已成功从IPSET_LIST移除~~~~")
			log.Info(bad_ip, " block time was more than ", block_time, "seconds,The IP was Remove from BLACK_IP_LIST")

		}

	}

}
